/**
 * 用 GPIO 口模拟 I2C 接口驱动
 */

#pragma once

#include "mcu.h"

/// @brief 模拟 I2C 接口驱动数据结构
typedef struct _unidrv_simi2c {
	func_gpio_write_out_t      scl;
	func_gpio_bidi_write_out_t sdaw;
	func_gpio_bidi_read_in_t   sdar;
	uint32_t delay_us;
} unidrv_simi2c_t;

/// @brief 产生 I2C 起始信号
void unidrv_simi2c_start(unidrv_simi2c_t *dev);
/// @brief 产生 I2C 停止信号
void unidrv_simi2c_stop(unidrv_simi2c_t *dev);
/// @brief 产生 ACK(true) / NACK(false) 应答
void unidrv_simi2c_ack(unidrv_simi2c_t *dev, bool ack);

/// @brief I2C 读 1 个字节, 并产生 ACK(true) / NACK(false) 应答
uint8_t unidrv_simi2c_rx(unidrv_simi2c_t *dev, bool ack);
/// @brief I2C 写 1 个字节
/// @return 对端是否有应答 ACK(true) / NACK(false)
bool unidrv_simi2c_tx(unidrv_simi2c_t *dev, uint8_t ch);
